using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Windows.Forms;
using App.Modelo.Interfaces;
using App.Persistencia;
using App.Seguridad.Vista;
using App.SolInf.Reportes;
using App.SolInf.Vista;

namespace App.Main
{
    class AplicacionPrincipal 
    {
        private IUsuario _usuarioActual;
        public Form FormularioPrincipal { get; set; }
        private List<IContenedorModulo> modulos;

        public ModuloPrincipal ModuloPrincipal { get; set; }

        public AplicacionPrincipal()    
        {
            modulos = new List<IContenedorModulo>();
            ModuloPrincipal = new ModuloPrincipal();

            ModuloPrincipal.UsuarioLogin += new EventHandler<UsuarioAccesoEventArgs>(moduloSeguridad_UsuarioLogin);
            ModuloPrincipal.UsuarioLogout += new EventHandler<UsuarioAccesoEventArgs>(moduloSeguridad_UsuarioLogout);
            ModuloPrincipal.Configurar();

            Repositorio.SessionCreada += new EventHandler<EventArgs>(Repositorio_SessionCreada);
            FormularioPrincipal = ModuloPrincipal.FormularioPrincipal;
            

            ModuloSeguridad.Instance.Init(ModuloPrincipal);
            RegistrarModulo(ModuloSeguridad.Instance);

            ModuloSolInf.Instance.Init(ModuloPrincipal);
            RegistrarModulo(ModuloSolInf.Instance);

            ModuloSolInfReportes.Instance.Init(ModuloPrincipal);
            RegistrarModulo(ModuloSolInfReportes.Instance);
        }
        

        void Repositorio_SessionCreada(object sender, EventArgs e)
        {
            var dbh = (Repositorio) sender;
            if (_usuarioActual != null)
            {
                var command = dbh.Connection.CreateCommand();
                    
                command.CommandText = "EXECUTE [dbo].[set_current_user] @id_usuario ";

                command.Parameters.Add(new SqlParameter("@id_usuario", _usuarioActual.Id));

                command.ExecuteScalar();
            }
        }

        public void RegistrarModulo(IContenedorModulo modulo)
        {
            modulos.Add(modulo);
        }
        
        void moduloSeguridad_UsuarioLogout(object sender, UsuarioAccesoEventArgs e)
        {
            _usuarioActual = null;

            foreach (var contenedorModulo in modulos)
            {
                if (contenedorModulo is ISessionActual)
                {
                    ((ISessionActual)contenedorModulo).UsuarioActual = null;
                }
            }

        }
        
        void moduloSeguridad_UsuarioLogin(object sender, UsuarioAccesoEventArgs e)
        {
            _usuarioActual = e.Usuario;

            foreach (var contenedorModulo in modulos)
            {
                if(contenedorModulo is ISessionActual)
                {
                    ((ISessionActual) contenedorModulo).UsuarioActual = _usuarioActual;
                }
            }

            
        }

    }
}